#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void setValue(char** str)
{
	*str = "Tom";	// str表示二级指针，*str表示一级指针，*str = "Tom"表示将一级指针指向静态区的Tom
}

void setValue2(int* str)
{
	*str = 100;		// str表示一级指针，str在外部被赋值NULL，*str表示取值，但是为NULL，然后赋值100，就会出现异常
}

int main()
{

	// 指针使用需要注意的地方
	// 1.指针移动
	char *name = "123456";
	int i = 0;
	int len = strlen(name);
	for(;i < len; i++)
	{
		printf("%c",*name);
		name++; // 指针不断向后移动
	}
	printf("\n");
	printf("name = %c\n",*name); // 此时的name指针已经不是在name首地址，想获取name的值会出现问题
	
	// 2.二级指针赋值
	char *str = NULL; 	// 此处赋值NULL，str指向的是一块不可操作的地址
	setValue(&str);		// &str是获取一级指针的地址，标识name的二级指针
	printf("str = %s\n",str);
	
	int *str2 = NULL;
	setValue2(str2);
	printf("str2 = %d\n",*str2);

	// 3.指针常量与常量指针
	const int number1 = 100;	// 常量无法被修改
	printf("常量number1：%d\n",number1);
	// Linux系统居然不可以修改常量的值，好吧，好像本来就不可以被修改，即使通过指针也不行
	//int* numP = &number1;
	//*numP = 900;
	//printf("常量number1，通过指针修改number1的值：%d\n",number1);

	int number2 = 200;
	// 常量指针，（值为常量，指针为变量）
	const int *numberP = &number2;
	//*numberP = 300; 	// 无法再修改值
	numberP = &number1;	// 但是对指针重新赋值

	// 指针常量，（值为变量，指针为常量）
	int* const numberP2 = &number2;
	*numberP2 = 400;		// 值可以修改
	//numberP2 = &number1;	// 但是指针无法修改

	exit(0);
}
